//电影票务模块实现
#include "../inc/movie_ticket.h"
#include "../inc/user_auth.h"    // 用于访问 g_logged_in_username
#include "../inc/ticket_print.h" // 用于访问 PURCHASE_RECORDS_FILE_PATH
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 用于 atof, strtol
#include <time.h>   // 用于时间戳

// 全局变量定义
char g_selected_movie_id[10] = "";
char g_selected_session_id[20] = ""; // 此变量将存储复合ID，例如 "M001_S001"

SeatStatus g_current_seat_map[6][12]; // 当前场次的座位状态
int g_current_seat_map_rows = 0;      // 当前座位图的行数
int g_current_seat_map_cols = 0;      // 当前座位图的列数

SelectedSeat g_selected_seats_list[MAX_SELECTED_SEATS]; // 已选座位列表
int g_num_selected_seats = 0;                           // 已选座位数量
float g_current_total_price = 0.0f;                     // 当前总价格

// 硬编码电影数据
static Movie hardcoded_movies[] = {
    {
        .id = "M001",
        .name = "无名之辈",
    },
    {
        .id = "M002",
        .name = "唐人街探案3",
    },
    {
        .id = "M003",
        .name = "流浪地球2",
    }
};
//电影数量
static const int NUM_HARDCODED_MOVIES = sizeof(hardcoded_movies) / sizeof(hardcoded_movies[0]);

// 硬编码场次数据
static MovieSession hardcoded_sessions[] = {
    {"S001", "1号厅", "10:30", "普通场", 30.00, "seats_S001.txt"},
    {"S002", "2号厅", "14:00", "3D MAX场", 40.00, "seats_S002.txt"},
    {"S003", "3号厅", "18:30", "普通场", 30.00, "seats_S003.txt"}
};

//影厅数量
static const int NUM_HARDCODED_SESSIONS = sizeof(hardcoded_sessions) / sizeof(hardcoded_sessions[0]);

/**
 * @brief 加载电影数据。
 * @param movies 用于存储电影数据的数组。
 * @param max_movies 数组的最大容量。
 * @return 加载的电影数量。
 */
int load_movies(Movie movies[], int max_movies) {
    printf("正在加载硬编码电影数据...\n");
    fflush(stdout);
    int count = 0;
    for (int i = 0; i < NUM_HARDCODED_MOVIES && i < max_movies; i++) {
        movies[i] = hardcoded_movies[i];
        count++;
    }
    printf("已加载 %d 部电影。\n", count);
    fflush(stdout);
    return count;
}

/**
 * @brief 根据电影ID获取电影信息。
 * @param movie_id 电影ID字符串。
 * @return 指向 Movie 结构体的指针，如果未找到则返回 NULL。
 */
const Movie* get_movie_by_id(const char* movie_id) {
    for (int i = 0; i < NUM_HARDCODED_MOVIES; i++) {
        if (strcmp(hardcoded_movies[i].id, movie_id) == 0) {
            return &hardcoded_movies[i];
        }
    }
    printf("警告：未找到电影ID '%s'。\n", movie_id);
    fflush(stdout);
    return NULL;
}

/**
 * @brief 根据电影ID获取电影名称。
 * @param movie_id 电影ID字符串。
 * @return 电影名称字符串，如果未找到则返回 "未知电影"。
 */
const char* get_movie_name_by_id(const char* movie_id) {
    const Movie* movie = get_movie_by_id(movie_id);
    if (movie) {
        return movie->name;
    }
    return "未知电影";
}

/**
 * @brief 根据复合场次ID (MXXX_SYYY) 获取场次模板信息。
 * @param composite_session_id 复合场次ID字符串。
 * @return 指向 MovieSession 结构体的指针，如果未找到则返回 NULL。                          
 */
const MovieSession* get_session_by_id(const char* composite_session_id) {
    if (composite_session_id == NULL) {
        return NULL;
    }

    // 查找下划线，尝试解析复合ID，例如 "M001_S001"
    char *underscore_pos = strchr(composite_session_id, '_');
    if (underscore_pos != NULL) {
        char original_session_id_buf[10];
        size_t len = strlen(underscore_pos + 1);
        if (len >= sizeof(original_session_id_buf)) {
             len = sizeof(original_session_id_buf) - 1;
        }
        strncpy(original_session_id_buf, underscore_pos + 1, len);
        original_session_id_buf[len] = '\0';
        
        return get_session_by_id_pure(original_session_id_buf);
    } else {
        return get_session_by_id_pure(composite_session_id);
    }
}

/**
 * @brief 根据场次ID (S001, S002等) 获取场次模板信息。
 * @param original_session_id 原始场次ID字符串。
 * @return 指向 MovieSession 结构体的指针，如果未找到则返回 NULL。
 */
const MovieSession* get_session_by_id_pure(const char* original_session_id) {
    if (original_session_id == NULL) {
        printf("警告：get_session_by_id_pure 接收到 NULL original_session_id。\n");
        fflush(stdout);
        return NULL;
    }
    for (int i = 0; i < NUM_HARDCODED_SESSIONS; i++) {
        if (strcmp(hardcoded_sessions[i].id, original_session_id) == 0) {
            return &hardcoded_sessions[i];
        }
    }
    printf("警告：未找到原始场次ID '%s'。\n", original_session_id);
    fflush(stdout);
    return NULL;
}

/**
 * @brief 根据复合场次ID获取场次详细信息字符串。
 * @param composite_session_id 复合场次ID字符串。
 * @param buffer 用于存储结果的缓冲区。
 * @param buffer_size 缓冲区大小。
 */
void get_session_details_by_composite_id(const char* composite_session_id, char* buffer, size_t buffer_size) {
    const MovieSession* session = get_session_by_id(composite_session_id);
    if (session) {
        snprintf(buffer, buffer_size, "%s (%s)", session->show_time, session->type);
    } else {
        strncpy(buffer, "未知场次", buffer_size);
        buffer[buffer_size - 1] = '\0';
    }
}

/**
 * @brief 从文件中加载座位图。
 * @param session_id 场次ID (复合ID)。
 * @param seat_map 用于存储座位状态的二维数组。
 * @param rows 指向行数的指针。
 * @param cols 指向列数的指针。
 * @return 0 成功，-1 失败。
 */
int load_seat_map(const char *session_id, SeatStatus seat_map[6][12], int *rows, int *cols) {
    char filename[128];
    snprintf(filename, sizeof(filename), "%s%s.txt", SEAT_MAP_FILE_PREFIX, session_id);

    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("座位图文件 %s 不存在，创建默认座位图。\n", filename);
        fflush(stdout);
        *rows = 6;
        *cols = 12;
        for (int r = 0; r < *rows; r++) {
            for (int c = 0; c < *cols; c++) {
                seat_map[r][c] = SEAT_AVAILABLE; // 默认所有座位可用
            }
        }
        save_seat_map(session_id, seat_map, *rows, *cols); // 保存默认座位图
        return 0;
    }

    char line[12 + 2]; // 假设一行最多12个座位字符 + 换行符 + '\0'
    int r = 0;
    int c_read = 0; // 用于记录实际读取的列数

    printf("正在从文件加载座位图 %s...\n", filename);
    fflush(stdout);
    while (fgets(line, sizeof(line), file) != NULL && r < 6) { // 固定读取6行
        line[strcspn(line, "\n")] = 0; // 移除换行符
        c_read = 0;
        for (int i = 0; i < strlen(line) && c_read < 12; i++) { // 固定读取12列
            if (line[i] == '0') {
                seat_map[r][c_read] = SEAT_AVAILABLE;
            } else if (line[i] == '1') {
                seat_map[r][c_read] = SEAT_SOLD;
            } else {
                seat_map[r][c_read] = SEAT_AVAILABLE; // 默认可用，以防文件格式错误
            }
            c_read++;
        }
        r++;
    }
    
    fclose(file);
    return 0;
}

/**
 * @brief 保存座位图到文件。
 * @param session_id 场次ID (复合ID)。
 * @param seat_map 存储座位状态的二维数组。
 * @param rows 行数。
 * @param cols 列数。
 * @return 0 成功，-1 失败。
 */
int save_seat_map(const char *session_id, const SeatStatus seat_map[6][12], int rows, int cols) {
    char filename[128];
    snprintf(filename, sizeof(filename), "%s%s.txt", SEAT_MAP_FILE_PREFIX, session_id);

    FILE *file = fopen(filename, "w"); // 使用 'w' 模式覆盖原有内容
    if (file == NULL) {
        printf("错误：无法打开座位图文件 %s 进行写入。\n", filename);
        fflush(stdout);
        return -1;
    }

    printf("正在保存座位图到文件 %s...\n", filename);
    fflush(stdout);
    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            fprintf(file, "%d", (int)seat_map[r][c]); // 0 或 1
        }
        fprintf(file, "\n");
    }

    fclose(file);
    printf("座位图已保存。\n");
    fflush(stdout);
    return 0;
}

/**
 * @brief 将购票信息追加到文件。
 * @param username 购买用户的用户名。
 * @param movie_id 购买的电影ID。
 * @param session_id 购买的场次ID。
 * @param ticket_count 购买的票数。
 * @param selected_seats 选中的座位字符串 (例如 "A1,B2")。
 * @return 0 成功，-1 失败。
 */
int record_purchase_info(const char *username, const char *movie_id, 
                        const char *session_id, int ticket_count, const char *selected_seats) {

    FILE *file = fopen(PURCHASE_RECORDS_FILE_PATH, "a+"); // "a+" 模式：追加写入，如果文件不存在则创建
    if (file == NULL) {
        printf("错误：无法打开购票记录文件 %s 进行写入。\n", PURCHASE_RECORDS_FILE_PATH);
        fflush(stdout);
        return -1;
    }

    time_t rawtime;
    struct tm *info;
    char timestamp_str[80];
    time(&rawtime);
    info = localtime(&rawtime);
    strftime(timestamp_str, 80, "%Y%m%d%H%M%S", info); // 生成时间戳

    // 获取单张票的价格
    const MovieSession* session = get_session_by_id(session_id);
    float unit_price = (session != NULL) ? session->price : 0.0f;

    char seats_copy[256];
    strncpy(seats_copy, selected_seats, sizeof(seats_copy) - 1);
    seats_copy[sizeof(seats_copy) - 1] = '\0';

    // 解析 selected_seats 字符串，将其拆分为单个座位，每张票单独记录
    char *token = strtok(seats_copy, ",");
    int current_ticket_num = 0;
    while (token != NULL && current_ticket_num < ticket_count) {
        // 格式：票号,用户名,电影ID,场次ID,票数(这里固定为1),单个座位信息,票价,时间戳
        fprintf(file, "TICKET_%s_%d,%s,%s,%s,%d,%s,%.2f,%s\n", timestamp_str, current_ticket_num + 1, username, movie_id, session_id, 1, token, unit_price, timestamp_str);
        printf("购票记录已追加：票号=TICKET_%s_%d, 用户名='%s', 电影ID='%s', 场次ID='%s', 票数=1, 座位='%s', 票价=%.2f\n", 
               timestamp_str, current_ticket_num + 1, username, movie_id, session_id, token, unit_price);
        token = strtok(NULL, ",");
        current_ticket_num++;
    }

    fclose(file);
    fflush(stdout);
    return 0;
}
